package alejandro.celulares

import scala.collection.mutable.ListBuffer
import java.util.Calendar

object Empresa extends Application{
	
	val listaClientes: ListBuffer[Cliente] = new ListBuffer[Cliente]()

	//el mes es base 0
	def minutosEnMes_1_1(mes: Integer, anio: Integer, cliente: Cliente): BigDecimal = {
	    cliente.minutosEnMes(mes, anio)	    	    
	}

	def montoFacturaEnMes_1_2(mes: Integer, anio: Integer, cliente: Cliente): BigDecimal = {
	    cliente.montoSinPromosFacturaEnMes(mes, anio)
	}

	def cantidadComunicacionesLargasEnMes_1_3(mes: Integer, anio: Integer, cliente: ClienteEstandar) = {
	    cliente.cantidadComunicacionesLargasEnMes(mes, anio)	   
	}
	
	def ciudadesLargaDistanciaEnMes_1_4(mes: Integer, anio: Integer, cliente: ClienteEstandar) = {
	    cliente.ciudadesLargaDistanciaEnMes(mes, anio)	    
	}
	
	def diaMasComunicacionesEnMes_1_5(mes: Integer, anio: Integer, cliente: ClienteEstandar) = {
	    cliente.diaMasComunicacionesEnMes(mes, anio)	   
	}
	
	def clienteConMas(op: Cliente => BigDecimal) = { //??? porq	ue no e puedo borrar el tipo del parametro
	    var clienteDistinguido = listaClientes.head
	    listaClientes.foreach(cli => if(op(cli)>op(clienteDistinguido)) clienteDistinguido = cli)	    
	    clienteDistinguido
	}
	
	def clienteConMasMinutos(mes: Integer, anio: Integer) = clienteConMas(cli => minutosEnMes_1_1(mes, anio, cli))
	def clienteConFacturaCara(mes: Integer, anio: Integer) = clienteConMas(cli => montoFacturaEnMes_1_2(mes, anio, cli))
    def clienteConMasComunicacionesLargas(mes: Integer, anio: Integer) = clienteConMas(cli => cantidadComunicacionesLargasEnMes_1_3(mes, anio, cli))
    
    def montoFacturaConDescuentosMesAnio(cliente: Cliente, mes: Integer, anio: Integer) = { 
	    cliente.montoFacturaConDescuentosMesAnio(mes, anio)
	}
	
	def mejorPlanParaCliente(cliente: Cliente, planes: ListBuffer[PlanDePago]):PlanDePago = {
	    val planReal = cliente.getPlan()
	    var planOptimo: PlanDePago = planes.head
	    var montoMinimo: BigDecimal = evaluarCliente(cliente, planOptimo)
	    planes.foreach{plan => 
	      var monto: BigDecimal = evaluarCliente(cliente, plan)
	      if(monto < montoMinimo) {
	        planOptimo = plan
	        montoMinimo = monto
	      }	        
	    }	    
	    cliente.setPlan(planReal)
	    planOptimo
	} 
    
	def evaluarCliente(cliente: Cliente, plan: PlanDePago): BigDecimal = {
	    cliente.setPlan(plan)
	    var montoFinal: BigDecimal = 0.0
	    (0 to 2).foreach{contador => 
	      montoFinal+=cliente.montoFacturaConDescuentosMesAnio(mesAnterior(contador), anioAnterior(contador))	    
	    }
	    montoFinal
	}
	
	def mesAnterior(mesesAtras: Integer): Integer = {
	    var ahora = Calendar.getInstance().get(Calendar.MONTH) - mesesAtras;
        if((ahora % 12) > 0){
          (ahora % 12)
        }
        else{
          12 + (ahora % 12)
        }
	}
	
	def anioAnterior(mesesAtras: Integer): Integer = {
	    var mesAtras = Calendar.getInstance().get(Calendar.MONTH) - mesesAtras;
	    var anioActual = Calendar.getInstance().get(Calendar.YEAR);	    
        if(mesAtras >= 0){
          anioActual
        }
        else{
          anioActual + (mesAtras / 12 - 1)
        }
	}
	
}